%TERMINOLOGIA

%Cadeia Ergódica - se é possível efectuar transições de qualquer estado para qualquer outro estado
%Cadeia Absorvente - se tiver pelo menos um estado absorvente E todos os
%estados conseguem chegar nele.

%Estado recorrente - se o sistema puder sempre voltar a ele (depois de sair dele)
%Estado transiente - se existe um outro estado qualquer para o qual o processo de Markov pode transitar, 
%mas do qual o processo não pode retornar
%Estado periódico - se apenas se pode regressar a ele após um número fixo de transições superior a 1 (ou múltiplos desse número)
%Estado absorvente - um estado do qual não é possível sair

%Spider trap - Quando há um loop infinito entre 2 ou mais estados, sem
%chances de "escapar da armadilha".
%Dead-end - Quando um estado só direciona a si mesmo (ou não direciona à ninguém).

%Forma Canônica
%   Q|0
%   R|I

%Q = Submatriz dos estados transientes para os transientes
%R = Sumatriz dos estados absorventes
%I = Matriz identidade

%Se a matriz estiver formatada:
numero_de_transientes = 3;
Q=T(1:numero_de_transientes, 1:numero_de_transientes)
R=T(ena+1:numero_de_transientes, 1:numero_de_transientes);
I = eye(size(Q))
%Q^n representa a probabilidade de permanecer em estados não-absorventes após n passos

%F = é a matriz fundamental do percurso aleatório.
F = inv(I-Q);
F = (I-Q)^(-1);

%Se quiser saber o valor esperado passos até absorção, basta fazer
estado_inicial = 1;
e = sum(F(:,estado_inicial))

mediaPassos=sum(F)
fprintf( "%d",mediaPassos(:,2) )
%começa em 1 -> coluna 1
%começa em 2 -> coluna 2

%Se quiser saber a PROBABILIDADE DE ABSORÇÃO, basta fazer
B = R*F;

%Se estiver falando de page rank, se a matriz tiver n elementos deve-se fazer:
pr = ones(n)'/n;

%Loopa por um valor alto
for i = 1:1000
    pr = T*pr;
end 

%Para solucionar um dead-end, é só fazer com que o estado aponte para todos
%os outros com uma chance igual.

%Para solucionar spider traps, é preciso usar o surfista aleatorio. Em cada
%passo, o surfista pode seguir um caminho aleatoriamente (probablidade b)
%ou saltar aleatoriamente para outro estado qualquer (probabilidade 1-b)
%Exemplo:

b = 0.8; %Geralmente fornecido pelo enunciado

N = 6; %Numero de estados
Hr = ones(N).*1/N;

A = b*T + (1-b)*Hr;

pr = ones(N, 1) / N;

for i = 1:10
    pr = A*pr;
end